This file is used to generate a dataset containing HF-SCs, IFE basal, granular or spinous, and ORS.
library(dplyr)
library(patchwork)
library(ggplot2)
.libPaths()
## [1] "/usr/local/lib/R/library"
In this section, we set the global settings of the analysis. We will store data there :
save_name = "non_matrix"
out_dir = "."
We load the sample information :
sample_info = readRDS(paste0(out_dir, "/../../1_metadata/hs_hd_sample_info.rds"))
project_names_oi = sample_info$project_name
graphics::pie(rep(1, nrow(sample_info)),
col = sample_info$color,
labels = sample_info$project_name)
Here are custom colors for each cell type :
color_markers = readRDS(paste0(out_dir, "/../../1_metadata/hs_hd_color_markers.rds"))
data.frame(cell_type = names(color_markers),
color = unlist(color_markers)) %>%
ggplot2::ggplot(., aes(x = cell_type, y = 0, fill = cell_type)) +
ggplot2::geom_point(pch = 21, size = 5) +
ggplot2::scale_fill_manual(values = unlist(color_markers), breaks = names(color_markers)) +
ggplot2::theme_classic() +
ggplot2::theme(legend.position = "none",
axis.line = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank(),
axis.text.y = element_blank(),
axis.text.x = element_text(angle = 30, hjust = 1))
We load the combined dataset containing all cell types from all samples :
sobj = readRDS(paste0(out_dir, "/../../3_combined/hs_hd_sobj.rds"))
sobj
## An object of class Seurat
## 20003 features across 12111 samples within 1 assay
## Active assay: RNA (20003 features, 2000 variable features)
## 6 dimensional reductions calculated: RNA_pca, RNA_pca_38_tsne, RNA_pca_38_umap, harmony, harmony_38_umap, harmony_38_tsne
We represent cells in the tSNE :
name2D = "harmony_38_tsne"
We smooth cell type annotation at a cluster level :
cluster_type = table(sobj$cell_type, sobj$seurat_clusters) %>%
prop.table(., margin = 2) %>%
apply(., 2, which.max)
cluster_type = setNames(nm = names(cluster_type),
levels(sobj$cell_type)[cluster_type])
sobj$cluster_type = cluster_type[sobj$seurat_clusters]
We look gene markers expression level, cell annotation and cluster-smoothed annotation on the projection, to locate non_matrix cells :
non_matrix_markers = c("KRT14", "COL17A1", "TK1")
non_matrix_cell_type = c("HF-SCs", "IFE basal", "IFE granular spinous", "ORS")
color_markers[!(names(color_markers) %in% non_matrix_cell_type)] = "gray92"
# Feature Plot
plot_list = lapply(non_matrix_markers, FUN = function(one_gene) {
p = Seurat::FeaturePlot(sobj, reduction = name2D,
features = one_gene) +
Seurat::NoAxes() +
ggplot2::scale_color_gradientn(colors = aquarius:::color_gene) +
ggplot2::theme(aspect.ratio = 1,
plot.subtitle = element_text(hjust = 0.5))
return(p)
})
# Cell type annotation
plot_list[[length(plot_list) + 1]] = Seurat::DimPlot(sobj, group.by = "cell_type",
cols = color_markers, reduction = name2D,
order = save_name) +
ggplot2::labs(title = "Cell annotation",
subtitle = paste0(sum(sobj$cell_type %in% non_matrix_cell_type),
" cells")) +
Seurat::NoAxes() + Seurat::NoLegend() +
ggplot2::theme(aspect.ratio = 1,
plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))
# Cluster-smoothed annotation
plot_list[[length(plot_list) + 1]] = Seurat::DimPlot(sobj,
reduction = name2D,
group.by = "cluster_type") +
ggplot2::scale_color_manual(values = c(unname(unlist(color_markers[non_matrix_cell_type])),
rep("gray92", length(color_markers) - length(non_matrix_cell_type))),
breaks = c(non_matrix_cell_type, setdiff(names(color_markers), non_matrix_cell_type))) +
ggplot2::labs(title = "Cluster annotation",
subtitle = paste0(sum(sobj$cluster_type %in% non_matrix_cell_type),
" cells")) +
Seurat::NoAxes() + Seurat::NoLegend() +
ggplot2::theme(aspect.ratio = 1,
plot.title = element_text(hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))
patchwork::wrap_plots(plot_list, nrow = 1)
We extract cells of interest based on the clustering :
sobj = subset(sobj, cluster_type %in% non_matrix_cell_type)
sobj
## An object of class Seurat
## 20003 features across 5599 samples within 1 assay
## Active assay: RNA (20003 features, 2000 variable features)
## 6 dimensional reductions calculated: RNA_pca, RNA_pca_38_tsne, RNA_pca_38_umap, harmony, harmony_38_umap, harmony_38_tsne
We remove all things that were calculated based on the full atlas :
sobj = Seurat::DietSeurat(sobj)
sobj
## An object of class Seurat
## 20003 features across 5599 samples within 1 assay
## Active assay: RNA (20003 features, 2000 variable features)
We keep a subset of meta.data and reset levels :
sobj@meta.data = sobj@meta.data[, c("orig.ident", "nCount_RNA", "nFeature_RNA", "log_nCount_RNA",
"project_name", "sample_identifier", "sample_type",
"laboratory", "location", "Seurat.Phase", "cyclone.Phase",
"percent.mt", "percent.rb", "cell_type")]
sobj$orig.ident = factor(sobj$orig.ident, levels = levels(sample_info$project_name))
sobj$project_name = factor(sobj$project_name, levels = levels(sample_info$project_name))
sobj$sample_identifier = factor(sobj$sample_identifier, levels = levels(sample_info$sample_identifier))
sobj$sample_type = factor(sobj$sample_type, levels = levels(sample_info$sample_type))
summary(sobj@meta.data)
## orig.ident nCount_RNA nFeature_RNA log_nCount_RNA project_name
## 2021_31: 489 Min. : 711 Min. : 500 Min. : 6.572 2021_31: 489
## 2021_36: 206 1st Qu.: 4978 1st Qu.:1608 1st Qu.: 8.513 2021_36: 206
## 2021_41:1102 Median : 10363 Median :2777 Median : 9.246 2021_41:1102
## 2022_03:1552 Mean : 13016 Mean :2789 Mean : 9.090 2022_03:1552
## 2022_14:1243 3rd Qu.: 17664 3rd Qu.:3842 3rd Qu.: 9.779 2022_14:1243
## 2022_01: 405 Max. :139798 Max. :7742 Max. :11.848 2022_01: 405
## 2022_02: 602 2022_02: 602
## sample_identifier sample_type laboratory location
## HS_1: 489 HS:4592 Length:5599 Length:5599
## HS_2: 206 HD:1007 Class :character Class :character
## HS_3:1102 Mode :character Mode :character
## HS_4:1552
## HS_5:1243
## HD_1: 405
## HD_2: 602
## Seurat.Phase cyclone.Phase percent.mt percent.rb
## Length:5599 Length:5599 Min. : 0.000 Min. : 0.4948
## Class :character Class :character 1st Qu.: 1.872 1st Qu.:21.6944
## Mode :character Mode :character Median : 4.347 Median :26.2587
## Mean : 4.696 Mean :25.4824
## 3rd Qu.: 6.397 3rd Qu.:30.5723
## Max. :19.954 Max. :46.0169
##
## cell_type
## IFE basal :1911
## ORS :1572
## HF-SCs :1355
## IFE granular spinous: 670
## sebocytes : 35
## proliferative : 34
## (Other) : 22
How many cells by sample ?
table(sobj$project_name)
##
## 2021_31 2021_36 2021_41 2022_03 2022_14 2022_01 2022_02
## 489 206 1102 1552 1243 405 602
We represent this information as a barplot :
aquarius::plot_barplot(df = table(sobj$project_name,
sobj$cell_type) %>%
as.data.frame.table() %>%
`colnames<-`(c("project_name", "cell_type", "nb_cells")),
x = "project_name", y = "nb_cells", fill = "cell_type",
position = position_stack()) +
ggplot2::scale_fill_manual(values = color_markers,
breaks = names(color_markers),
name = "Cell type")
We remove genes that are expressed in less than 5 cells :
sobj = aquarius::filter_features(sobj, min_cells = 5)
## [1] 20003 5599
## [1] 17837 5599
sobj
## An object of class Seurat
## 17837 features across 5599 samples within 1 assay
## Active assay: RNA (17837 features, 1706 variable features)
We normalize the count matrix for remaining cells :
sobj = Seurat::NormalizeData(sobj,
normalization.method = "LogNormalize")
sobj = Seurat::FindVariableFeatures(sobj, nfeatures = 2000)
sobj = Seurat::ScaleData(sobj)
sobj
## An object of class Seurat
## 17837 features across 5599 samples within 1 assay
## Active assay: RNA (17837 features, 2000 variable features)
We perform a PCA :
sobj = Seurat::RunPCA(sobj,
assay = "RNA",
reduction.name = "RNA_pca",
npcs = 100,
seed.use = 1337L)
sobj
## An object of class Seurat
## 17837 features across 5599 samples within 1 assay
## Active assay: RNA (17837 features, 2000 variable features)
## 1 dimensional reduction calculated: RNA_pca
We choose the number of dimensions such that they summarize 35 % of the variability :
stdev = sobj@reductions[["RNA_pca"]]@stdev
stdev_prop = cumsum(stdev)/sum(stdev)
ndims = which(stdev_prop > 0.35)[1]
ndims
## [1] 18
We can visualize this on the elbow plot :
elbow_p = Seurat::ElbowPlot(sobj, ndims = 100, reduction = "RNA_pca") +
ggplot2::geom_point(x = ndims, y = stdev[ndims], col = "red")
x_text = ggplot_build(elbow_p)$layout$panel_params[[1]]$x$get_labels() %>% as.numeric()
elbow_p = elbow_p +
ggplot2::scale_x_continuous(breaks = sort(c(x_text, ndims)), limits = c(0, 100))
x_color = ifelse(ggplot_build(elbow_p)$layout$panel_params[[1]]$x$get_labels() %>%
as.numeric() %>% round(., 2) == round(ndims, 2), "red", "black")
elbow_p = elbow_p +
ggplot2::theme_classic() +
ggplot2::theme(axis.text.x = element_text(color = x_color))
elbow_p
We generate a tSNE and a UMAP with 18 principal components :
sobj = Seurat::RunTSNE(sobj,
reduction = "RNA_pca",
dims = 1:ndims,
seed.use = 1337L,
reduction.name = paste0("RNA_pca_", ndims, "_tsne"))
sobj = Seurat::RunUMAP(sobj,
reduction = "RNA_pca",
dims = 1:ndims,
seed.use = 1337L,
reduction.name = paste0("RNA_pca_", ndims, "_umap"))
We can visualize the two representations :
tsne = Seurat::DimPlot(sobj, group.by = "project_name",
reduction = paste0("RNA_pca_", ndims, "_tsne")) +
ggplot2::scale_color_manual(values = sample_info$color,
breaks = sample_info$project_name) +
Seurat::NoAxes() + ggplot2::ggtitle("PCA - tSNE") +
ggplot2::theme(aspect.ratio = 1,
plot.title = element_text(hjust = 0.5),
legend.position = "none")
umap = Seurat::DimPlot(sobj, group.by = "project_name",
reduction = paste0("RNA_pca_", ndims, "_umap")) +
ggplot2::scale_color_manual(values = sample_info$color,
breaks = sample_info$project_name) +
Seurat::NoAxes() + ggplot2::ggtitle("PCA - UMAP") +
ggplot2::theme(aspect.ratio = 1,
plot.title = element_text(hjust = 0.5))
tsne | umap
There is a batch-effect.
We remove batch-effect using Harmony :
`%||%` = function(lhs, rhs) {
if (!is.null(x = lhs)) {
return(lhs)
} else {
return(rhs)
}
}
set.seed(1337L)
sobj = harmony::RunHarmony(object = sobj,
group.by.vars = "project_name",
plot_convergence = TRUE,
reduction = "RNA_pca",
assay.use = "RNA",
reduction.save = "harmony",
max.iter.harmony = 20,
project.dim = FALSE)
From this batch-effect removed projection, we generate a tSNE and a UMAP.
sobj = Seurat::RunUMAP(sobj,
seed.use = 1337L,
dims = 1:ndims,
reduction = "harmony",
reduction.name = paste0("harmony_", ndims, "_umap"),
reduction.key = paste0("harmony_", ndims, "umap_"))
sobj = Seurat::RunTSNE(sobj,
dims = 1:ndims,
seed.use = 1337L,
reduction = "harmony",
reduction.name = paste0("harmony_", ndims, "_tsne"),
reduction.key = paste0("harmony", ndims, "tsne_"))
These are the corrected UMAP and tSNE :
tsne = Seurat::DimPlot(sobj, group.by = "project_name",
reduction = paste0("harmony_", ndims, "_tsne")) +
ggplot2::scale_color_manual(values = sample_info$color,
breaks = sample_info$project_name) +
Seurat::NoAxes() + ggplot2::ggtitle("PCA - harmony - tSNE") +
ggplot2::theme(aspect.ratio = 1,
plot.title = element_text(hjust = 0.5),
legend.position = "none")
umap = Seurat::DimPlot(sobj, group.by = "project_name",
reduction = paste0("harmony_", ndims, "_umap")) +
ggplot2::scale_color_manual(values = sample_info$color,
breaks = sample_info$project_name) +
Seurat::NoAxes() + ggplot2::ggtitle("PCA - harmony - UMAP") +
ggplot2::theme(aspect.ratio = 1,
plot.title = element_text(hjust = 0.5))
tsne | umap
We generate a diffusion map from the batch-effect corrected space :
sobj = aquarius::run_diffusion_map(sobj = sobj,
input = "harmony",
seed = 1337L,
verbose = TRUE,
n_eigs = 50,
suppress_dpt = TRUE,
return_dm = FALSE)
## finding knns......done. Time: 47.80s
## Calculating transition probabilities......done. Time: 2.25s
##
## performing eigen decomposition......done. Time: 5.09s
dm_name = paste0("harmony_dm")
Seurat::DimPlot(sobj, reduction = dm_name,
group.by = "cell_type", cols = color_markers) +
ggplot2::labs(title = dm_name) +
ggplot2::theme(aspect.ratio = 1,
plot.title = element_text(hjust = 0.5)) +
Seurat::NoAxes()
We generate a UMAP from the diffusion map :
umap_dm_dims = 5
umap_name = paste0(dm_name, "_", umap_dm_dims, "_umap")
sobj = Seurat::RunUMAP(sobj, reduction = dm_name,
dims = 1:umap_dm_dims,
reduction.name = umap_name,
verbose = TRUE, seed.use = 1337L)
Seurat::DimPlot(sobj, reduction = umap_name,
group.by = "cell_type", cols = color_markers) +
ggplot2::labs(title = umap_name) +
ggplot2::theme(aspect.ratio = 1,
plot.title = element_text(hjust = 0.5)) +
Seurat::NoAxes()
We will keep the tSNE from Harmony :
reduction = "harmony"
name2D = paste0("harmony_", ndims, "_tsne")
We generate a clustering :
sobj = Seurat::FindNeighbors(sobj, reduction = reduction, dims = 1:ndims)
sobj = Seurat::FindClusters(sobj, resolution = 0.9)
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
##
## Number of nodes: 5599
## Number of edges: 211245
##
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.8634
## Number of communities: 18
## Elapsed time: 0 seconds
dimplot_clusters = Seurat::DimPlot(sobj, reduction = name2D, label = TRUE) +
Seurat::NoAxes() +
ggplot2::theme(aspect.ratio = 1)
dimplot_clusters
We can represent the 4 quality metrics :
plot_list = Seurat::FeaturePlot(sobj, reduction = name2D,
combine = FALSE, pt.size = 0.5,
features = c("percent.mt", "percent.rb", "nFeature_RNA", "log_nCount_RNA"))
plot_list = lapply(plot_list, FUN = function(one_plot) {
one_plot +
Seurat::NoAxes() +
ggplot2::scale_color_gradientn(colors = aquarius:::color_gene) +
ggplot2::theme(aspect.ratio = 1)
})
patchwork::wrap_plots(plot_list, nrow = 1)
We smooth cell type annotation at a cluster level :
cluster_type = table(sobj$cell_type, sobj$seurat_clusters) %>%
prop.table(., margin = 2) %>%
apply(., 2, which.max)
cluster_type = setNames(nm = names(cluster_type),
levels(sobj$cell_type)[cluster_type])
sobj$cluster_type = cluster_type[sobj$seurat_clusters]
We visualize the cluster type annotation :
plot_list = lapply(c(paste0("harmony_", ndims, "_tsne"),
paste0("harmony_", ndims, "_umap")), FUN = function(one_proj) {
Seurat::DimPlot(sobj, group.by = "cluster_type",
reduction = one_proj) +
ggplot2::scale_color_manual(values = color_markers,
breaks = names(color_markers)) +
Seurat::NoAxes() + ggplot2::ggtitle(one_proj) +
ggplot2::theme(aspect.ratio = 1,
plot.title = element_text(hjust = 0.5),
legend.position = "right")
})
patchwork::wrap_plots(plot_list, ncol = 2) +
patchwork::plot_layout(guides = "collect")
We can visualize the two batch-effect corrected representations :
plot_list = lapply(c(paste0("harmony_", ndims, "_tsne"),
paste0("harmony_", ndims, "_umap")), FUN = function(one_proj) {
Seurat::DimPlot(sobj, group.by = "project_name",
reduction = one_proj) +
ggplot2::scale_color_manual(values = sample_info$color,
breaks = sample_info$project_name) +
Seurat::NoAxes() + ggplot2::ggtitle(one_proj) +
ggplot2::theme(aspect.ratio = 1,
plot.title = element_text(hjust = 0.5),
legend.position = "none")
})
patchwork::wrap_plots(plot_list, ncol = 2)
We can represent clusters, split by sample of origin :
plot_list = aquarius::plot_split_dimred(sobj,
reduction = name2D,
split_by = "sample_identifier",
group_by = "seurat_clusters",
split_color = setNames(sample_info$color,
nm = sample_info$sample_identifier),
group_color = aquarius::gg_color_hue(length(levels(sobj$seurat_clusters))),
main_pt_size = 0.5, bg_pt_size = 0.5)
plot_list[[length(plot_list) + 1]] = dimplot_clusters
patchwork::wrap_plots(plot_list, ncol = 4) +
patchwork::plot_layout(guides = "collect") &
ggplot2::theme(legend.position = "none")
We save the Seurat object :
saveRDS(sobj, file = paste0(out_dir, "/", save_name, "_sobj.rds"))
## R version 3.6.3 (2020-02-29)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.6 LTS
##
## Matrix products: default
## BLAS: /usr/local/lib/R/lib/libRblas.so
## LAPACK: /usr/local/lib/R/lib/libRlapack.so
##
## locale:
## [1] C
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] ggplot2_3.3.5 patchwork_1.1.2 dplyr_1.0.7
##
## loaded via a namespace (and not attached):
## [1] softImpute_1.4 graphlayouts_0.7.0
## [3] pbapply_1.4-2 lattice_0.20-41
## [5] haven_2.3.1 vctrs_0.3.8
## [7] usethis_2.0.1 dynwrap_1.2.1
## [9] blob_1.2.1 survival_3.2-13
## [11] prodlim_2019.11.13 dynutils_1.0.5
## [13] later_1.3.0 DBI_1.1.1
## [15] R.utils_2.11.0 SingleCellExperiment_1.8.0
## [17] rappdirs_0.3.3 uwot_0.1.8
## [19] dqrng_0.2.1 jpeg_0.1-8.1
## [21] zlibbioc_1.32.0 pspline_1.0-18
## [23] pcaMethods_1.78.0 mvtnorm_1.1-1
## [25] htmlwidgets_1.5.4 GlobalOptions_0.1.2
## [27] future_1.22.1 UpSetR_1.4.0
## [29] laeken_0.5.2 leiden_0.3.3
## [31] clustree_0.4.3 parallel_3.6.3
## [33] scater_1.14.6 irlba_2.3.3
## [35] DEoptimR_1.0-9 tidygraph_1.1.2
## [37] Rcpp_1.0.9 readr_2.0.2
## [39] KernSmooth_2.23-17 carrier_0.1.0
## [41] promises_1.1.0 gdata_2.18.0
## [43] DelayedArray_0.12.3 limma_3.42.2
## [45] graph_1.64.0 RcppParallel_5.1.4
## [47] Hmisc_4.4-0 fs_1.5.2
## [49] RSpectra_0.16-0 fastmatch_1.1-0
## [51] ranger_0.12.1 digest_0.6.25
## [53] png_0.1-7 sctransform_0.2.1
## [55] cowplot_1.0.0 DOSE_3.12.0
## [57] here_1.0.1 TInGa_0.0.0.9000
## [59] ggraph_2.0.3 pkgconfig_2.0.3
## [61] GO.db_3.10.0 DelayedMatrixStats_1.8.0
## [63] gower_0.2.1 ggbeeswarm_0.6.0
## [65] iterators_1.0.12 DropletUtils_1.6.1
## [67] reticulate_1.26 clusterProfiler_3.14.3
## [69] SummarizedExperiment_1.16.1 circlize_0.4.15
## [71] beeswarm_0.4.0 GetoptLong_1.0.5
## [73] xfun_0.35 bslib_0.3.1
## [75] zoo_1.8-10 tidyselect_1.1.0
## [77] reshape2_1.4.4 purrr_0.3.4
## [79] ica_1.0-2 pcaPP_1.9-73
## [81] viridisLite_0.3.0 rtracklayer_1.46.0
## [83] rlang_1.0.2 hexbin_1.28.1
## [85] jquerylib_0.1.4 dyneval_0.9.9
## [87] glue_1.4.2 RColorBrewer_1.1-2
## [89] matrixStats_0.56.0 stringr_1.4.0
## [91] lava_1.6.7 europepmc_0.3
## [93] DESeq2_1.26.0 recipes_0.1.17
## [95] labeling_0.3 harmony_0.1.0
## [97] httpuv_1.5.2 class_7.3-17
## [99] BiocNeighbors_1.4.2 DO.db_2.9
## [101] annotate_1.64.0 jsonlite_1.7.2
## [103] XVector_0.26.0 bit_4.0.4
## [105] mime_0.9 aquarius_0.1.5
## [107] Rsamtools_2.2.3 gridExtra_2.3
## [109] gplots_3.0.3 stringi_1.4.6
## [111] processx_3.5.2 gsl_2.1-6
## [113] bitops_1.0-6 cli_3.0.1
## [115] batchelor_1.2.4 RSQLite_2.2.0
## [117] randomForest_4.6-14 tidyr_1.1.4
## [119] data.table_1.14.2 rstudioapi_0.13
## [121] org.Mm.eg.db_3.10.0 GenomicAlignments_1.22.1
## [123] nlme_3.1-147 qvalue_2.18.0
## [125] scran_1.14.6 locfit_1.5-9.4
## [127] scDblFinder_1.1.8 listenv_0.8.0
## [129] ggthemes_4.2.4 knn.covertree_1.0
## [131] gridGraphics_0.5-0 R.oo_1.24.0
## [133] dbplyr_1.4.4 BiocGenerics_0.32.0
## [135] TTR_0.24.2 readxl_1.3.1
## [137] lifecycle_1.0.1 timeDate_3043.102
## [139] ggpattern_0.3.1 munsell_0.5.0
## [141] cellranger_1.1.0 R.methodsS3_1.8.1
## [143] proxyC_0.1.5 visNetwork_2.0.9
## [145] caTools_1.18.0 codetools_0.2-16
## [147] Biobase_2.46.0 GenomeInfoDb_1.22.1
## [149] vipor_0.4.5 lmtest_0.9-38
## [151] msigdbr_7.5.1 htmlTable_1.13.3
## [153] triebeard_0.3.0 lsei_1.2-0
## [155] xtable_1.8-4 ROCR_1.0-7
## [157] BiocManager_1.30.10 scatterplot3d_0.3-41
## [159] abind_1.4-5 farver_2.0.3
## [161] parallelly_1.28.1 RANN_2.6.1
## [163] askpass_1.1 GenomicRanges_1.38.0
## [165] RcppAnnoy_0.0.16 tibble_3.1.5
## [167] ggdendro_0.1-20 cluster_2.1.0
## [169] future.apply_1.5.0 Seurat_3.1.5
## [171] dendextend_1.15.1 Matrix_1.3-2
## [173] ellipsis_0.3.2 prettyunits_1.1.1
## [175] lubridate_1.7.9 ggridges_0.5.2
## [177] igraph_1.2.5 RcppEigen_0.3.3.7.0
## [179] fgsea_1.12.0 remotes_2.4.2
## [181] scBFA_1.0.0 destiny_3.0.1
## [183] VIM_6.1.1 testthat_3.1.0
## [185] htmltools_0.5.2 BiocFileCache_1.10.2
## [187] yaml_2.2.1 utf8_1.1.4
## [189] plotly_4.9.2.1 XML_3.99-0.3
## [191] ModelMetrics_1.2.2.2 e1071_1.7-3
## [193] foreign_0.8-76 withr_2.5.0
## [195] fitdistrplus_1.0-14 BiocParallel_1.20.1
## [197] xgboost_1.4.1.1 bit64_4.0.5
## [199] foreach_1.5.0 robustbase_0.93-9
## [201] Biostrings_2.54.0 GOSemSim_2.13.1
## [203] rsvd_1.0.3 memoise_2.0.0
## [205] evaluate_0.18 forcats_0.5.0
## [207] rio_0.5.16 geneplotter_1.64.0
## [209] tzdb_0.1.2 caret_6.0-86
## [211] ps_1.6.0 DiagrammeR_1.0.6.1
## [213] curl_4.3 fdrtool_1.2.15
## [215] fansi_0.4.1 highr_0.8
## [217] urltools_1.7.3 xts_0.12.1
## [219] GSEABase_1.48.0 acepack_1.4.1
## [221] edgeR_3.28.1 checkmate_2.0.0
## [223] scds_1.2.0 cachem_1.0.6
## [225] npsurv_0.4-0 babelgene_22.3
## [227] rjson_0.2.20 openxlsx_4.1.5
## [229] ggrepel_0.9.1 clue_0.3-60
## [231] rprojroot_2.0.2 stabledist_0.7-1
## [233] tools_3.6.3 sass_0.4.0
## [235] nichenetr_1.1.1 magrittr_2.0.1
## [237] RCurl_1.98-1.2 proxy_0.4-24
## [239] car_3.0-11 ape_5.3
## [241] ggplotify_0.0.5 xml2_1.3.2
## [243] httr_1.4.2 assertthat_0.2.1
## [245] rmarkdown_2.18 boot_1.3-25
## [247] globals_0.14.0 R6_2.4.1
## [249] Rhdf5lib_1.8.0 nnet_7.3-14
## [251] RcppHNSW_0.2.0 progress_1.2.2
## [253] genefilter_1.68.0 statmod_1.4.34
## [255] gtools_3.8.2 shape_1.4.6
## [257] HDF5Array_1.14.4 BiocSingular_1.2.2
## [259] rhdf5_2.30.1 splines_3.6.3
## [261] AUCell_1.8.0 carData_3.0-4
## [263] colorspace_1.4-1 generics_0.1.0
## [265] stats4_3.6.3 base64enc_0.1-3
## [267] dynfeature_1.0.0 smoother_1.1
## [269] gridtext_0.1.1 pillar_1.6.3
## [271] tweenr_1.0.1 sp_1.4-1
## [273] ggplot.multistats_1.0.0 rvcheck_0.1.8
## [275] GenomeInfoDbData_1.2.2 plyr_1.8.6
## [277] gtable_0.3.0 zip_2.2.0
## [279] knitr_1.41 ComplexHeatmap_2.14.0
## [281] latticeExtra_0.6-29 biomaRt_2.42.1
## [283] IRanges_2.20.2 fastmap_1.1.0
## [285] ADGofTest_0.3 copula_1.0-0
## [287] doParallel_1.0.15 AnnotationDbi_1.48.0
## [289] vcd_1.4-8 babelwhale_1.0.1
## [291] openssl_1.4.1 scales_1.1.1
## [293] backports_1.2.1 S4Vectors_0.24.4
## [295] ipred_0.9-12 enrichplot_1.6.1
## [297] hms_1.1.1 ggforce_0.3.1
## [299] Rtsne_0.15 shiny_1.7.1
## [301] numDeriv_2016.8-1.1 polyclip_1.10-0
## [303] grid_3.6.3 lazyeval_0.2.2
## [305] Formula_1.2-3 tsne_0.1-3
## [307] crayon_1.3.4 MASS_7.3-54
## [309] pROC_1.16.2 viridis_0.5.1
## [311] dynparam_1.0.0 rpart_4.1-15
## [313] zinbwave_1.8.0 compiler_3.6.3
## [315] ggtext_0.1.0